package com.air.controller.airline;



import com.air.dto.AirLineDTO;
import com.air.dto.AirLineLoginDTO;


import com.air.dto.AirLinePageQueryDTO;
import com.air.entity.AirLine;


import com.air.result.PageResult;
import com.air.result.Result;
import com.air.service.AirLineService;

import com.air.vo.AirLineLoginVO;

import com.air.vo.AirLineVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;


/**
 * 航空公司的控制器，负责处理与航空公司相关的HTTP请求。
 * 使用@RestController注解标识该类为Spring MVC中的控制器，负责处理HTTP请求。
 * @RequestMapping注解指定了该控制器处理的所有请求的URL前缀为/airline。
 * @Slf4j注解用于自动插入日志记录器，简化日志记录的操作。
 * @Api注解为该类添加Swagger文档注释，指明该类是航空相关的API接口。
 */
@RestController
@RequestMapping("/airline")
@Slf4j
@Api(tags = "航空相关接口")
public class AirLineController {

    /**
     * 自动装配的航空公司服务实例。
     * 通过@Autowired注解，Spring框架会自动将实现了AirLineService接口的bean注入到这个字段中。
     * 这样做的目的是为了在当前类中可以直接使用airLineService实例来调用其提供的航空公司相关服务，
     * 而不需要手动创建或管理这个实例的生命周期。
     */
    @Autowired
    private AirLineService airLineService;



    /**
     * 处理航空公司的注册请求。
     *
     * 通过此接口，可以将一个新的航空公司信息保存到系统中。
     * 请求体中应包含航空公司的详细信息，由AirLineDTO数据传输对象承载。
     *
     * @param airLineDTO 航空公司的数据传输对象，包含注册所需的信息。
     * @return 返回操作结果，如果保存成功，则返回成功的标志。
     */
    @PostMapping("/register")
    @ApiOperation("注册航空")
    public Result save(@RequestBody AirLineDTO airLineDTO){ //使用@RequestBody注解表明请求体中的数据将被绑定到方法参数上。
        // 调用航空公司服务保存航空公司的相关信息
        airLineService.save(airLineDTO);
        // 返回操作成功的结果反馈
        return Result.success();

    }

    /**
     * 处理航空公司的登录请求。
     *
     * @param airLineLoginDTO 包含登录信息的数据传输对象，如用户名和密码。
     * @return 返回一个包含登录成功后用户信息的结果对象。
     *
     * @PostMapping("/login") 注解指定了处理登录请求的URL路径。
     * @ApiOperation("航空登录") 注解用于API文档，描述了这个方法的功能。
     */
    @PostMapping("/login")
    @ApiOperation("航空登录")
    public Result<AirLineLoginVO> login(@RequestBody AirLineLoginDTO airLineLoginDTO) {
        // 调用服务层方法进行登录验证，并获取登录成功的航空公司信息。
        AirLine airLine = airLineService.login(airLineLoginDTO);

        // 根据登录成功的航空公司信息，构建并返回一个包含必要信息的登录视图对象。
        AirLineLoginVO airLineLoginVO = AirLineLoginVO.builder()
                .id(airLine.getId())
                .userName(airLine.getUsername())
                .name(airLine.getName())
                .build();

        // 返回一个表示登录成功的结果对象，其中包含构建的登录视图对象。
        return Result.success(airLineLoginVO);
    }

    /**
     * 退出
     * @return
     */
    @PostMapping("/logout")
    @ApiOperation("航空退出")
    public Result<String> logout() {
        return Result.success();
    }


    /**
     * 分页查询航空信息。
     * 通过该接口，可以根据查询条件进行航空公司的分页查询。查询条件封装在AirLinePageQueryDTO对象中。
     * 返回的结果是一个包含分页信息和航空数据的PageResult对象。
     *
     * @param airLinePageQueryDTO 分页查询条件，包含页码、每页大小等信息以及可能的过滤条件。
     * @return 返回查询结果的分页信息，包括总页数、当前页的航空数据等。
     * @apiNote 该接口使用了Swagger的ApiOperation注解，用于文档化该接口的功能。
     */
    @GetMapping("/page")
    @ApiOperation("分页查询航空")
    public Result<PageResult> page(AirLinePageQueryDTO airLinePageQueryDTO) {
        // 调用航空服务的分页查询方法，传入查询条件
        PageResult pageResult = airLineService.pageQuery(airLinePageQueryDTO);
        // 将查询结果封装在Result对象中返回，表示操作成功
        return Result.success(pageResult);
    }


    /**
     * 根据航空公司的ID查询航空公司的详细信息。
     *
     * @param id 航空公司的唯一标识符。
     * @return 包含航空公司详细信息的结果对象。
     */
    @GetMapping("/{id}")
    @ApiOperation("根据id查询航空")
    public Result<AirLineVO> getById(@PathVariable Long id) { //路径变量（@PathVariable）获取URL中指定的ID，这表明请求的URL中必须包含一个表示ID的部分。
        // 记录查询航空公司的日志信息
        log.info("根据id查询航空：{}", id);
        // 通过航空公司服务根据ID查询航空公司的详细信息
        AirLineVO airLineVO = airLineService.getById(id);
        // 返回查询结果，如果查询成功，则返回包含航空公司详细信息的结果对象
        return Result.success(airLineVO);
    }

    /**
     * 修改航空信息
     * @param airLineDTO
     * @return
     */
    /**
     * 通过PUT请求更新航空信息。
     *
     * @param airLineDTO 包含待更新航空信息的数据传输对象。
     * @return 返回操作结果，如果操作成功，则返回一个成功的Result对象。
     *
     * @PutMapping 注解定义了这个方法处理PUT请求。
     * @ApiOperation 注解用于描述这个接口的操作，这里指修改航空信息。
     */
    @PutMapping
    @ApiOperation("修改航空信息")
    public Result update(@RequestBody AirLineDTO airLineDTO) {
        // 记录日志，用于跟踪和调试
        log.info("修改航空信息：{}", airLineDTO);
        // 调用航空服务层的方法来实际执行更新操作
        airLineService.update(airLineDTO);
        // 返回操作成功的结果
        return Result.success();
    }
}
